我想知道,要使@Id
批注起作用,数据库中的表是否需要具有主键。 (对于@ManyToOne
注释和外键也一样,但是我还没有研究这种情况。)
数据库中有一个表foo
,该表没有主键,只有2列,id
和name
。
在Java中,一个@Entity Foo
具有2个属性:@Id id
和String name
。
在persistence.xml中,hibernate.hbm2ddl.auto
不是create
;桌子已经在那里了。
当我在同一事务中使用相同的Foo
保存2个id
时,Hiberate抗议:javax.persistence.EntityExistsException:具有相同标识符值的另一个对象已与该会话关联。
Hibernate接管数据库中的主键是真的吗? (除了索引)?
但是当我将2个Foo
分别保存在2个事务中时,它们将保存到数据库中,因此Hiberate的@Id
不能用作主键!
是否故意@Id
仅在同一笔交易中起作用?
Java中的实体和事务为:
@Entity
public class Foo {
@Id
private Long id;
private String name;
// <init>s and getters and setters
public class EntityTests
private String name;
@Test
public void test2() throws Exception {
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
Foo foo=new Foo(1l,"bar");
entityManager.persist(foo);
entityManager.getTransaction().commit();
entityManager.close();
entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
Foo foo2=new Foo(1l,"baz");
entityManager.persist(foo2);
entityManager.getTransaction().commit();
entityManager.close();
}
在数据库中,我们看到:
sql> select*from foo;
ID | NAME
1 | bar
1 | baz
答案 0 :(得分:0)
如果您在休眠状态下阅读了有关标识符的文档,它说它们假定相应的db列是唯一的,不是null和不可变的,因此,当您已经有数据库表时,则需要确保表格中相应的标识符列符合这些要求