我是Java Hibernate的新手。我在我的代码中得到了以下错误。我正在尝试实现多对多关系,我在谷歌上搜索并理解了这个概念,但我无法为像我这样的初学者找到合适的实现。提前谢谢。
Students.java
@Entity
@Table
public class Students
{
@Id
private int roll_no;
private float marks;
private String name;
@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(
name = "mobiles_students",
joinColumns = { @JoinColumn(name = "roll_no") },
inverseJoinColumns = { @JoinColumn(name = "mob_id") }
)
private List<Mobiles> mobile = new ArrayList<Mobiles>();
// Getters, SettersMobiles.java
@Entity
public class Mobiles
{
@Id
private int mob_id;
private String mobile;
@ManyToMany(mappedBy = "mobile")
private List<Students> studs = new ArrayList<Students>();
// Getters, SettersApp.java
public class App
{
public static void main( String[] args )
{
Configuration con = new Configuration().configure().addAnnotatedClass(Students.class).addAnnotatedClass(Mobiles.class);
SessionFactory factory = con.buildSessionFactory();
Session session = factory.openSession();
Transaction t = session.beginTransaction();
Mobiles mobile1 = new Mobiles();
mobile1.setMob_id(3);
mobile1.setMobile("Redmi K20");
Mobiles mobile2 = new Mobiles();
mobile2.setMob_id(3);
mobile2.setMobile("Nokia 6.1 Plus");
Students stud1 = new Students();
stud1.setRoll_no(3);
stud1.setMarks(100);
stud1.setName("Vivek");
List<Mobiles> mob = new ArrayList<Mobiles>();
mob.add(mobile1);
mob.add(mobile2);
stud1.setMobile(mob);
// stud1.getMobile().add(mobile1);
// stud1.getMobile().add(mobile2);
// mobile1.getStuds().add(stud1);
// mobile2.getStuds().add(stud1);
// Students stud = (Students)session.get(Students.class, 1);
session.save(mobile1);
session.save(mobile2);
session.save(stud1);
t.commit();
// System.out.println(stud);
}
}错误
INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
Exception in thread "main" org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [com.vivek.NewJavaApp.Mobiles#3]
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:180)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:135)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:194)
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:179)
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:634)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:627)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:622)
at com.vivek.NewJavaApp.App.main(App.java:52)发布于 2020-06-22 03:37:03
在您的Mobiles实体类字段中,mob_id被标注为@Id。使用@Id注释的字段通常应该被赋予一个惟一的值(通常也可以通过自动生成该值)。在主应用程序App.java中,您需要手动将mob_id属性设置为相同的值3两次。这会导致引发NonUniqueObjectException。
https://stackoverflow.com/questions/62502483
复制相似问题