0

我想创建两个表 USER 和 USERDETAIL 来完成:

  1. USERDETAIL 引用了 USER 表。

  2. 对 USER 表的操作不需要知道 USERDEAIL 表的存在。

这应该是一对一的非双向关系。

实体类:

@Entity
@Table(name="USER")
public class User implements Serializable{  
    @Id 
    @Column(name="ID")
    @GeneratedValue(generator = "system-uuid") 
    @GenericGenerator(name = "system-uuid", strategy = "uuid")  
    private String id;  
    //...
}

@Entity
@Table(name="USERDETAIL")
public class UserDetail implements Serializable{    

    @Id 
    @Column(name="ID")
    @GeneratedValue(generator = "gen") 
    @GenericGenerator(name = "gen", strategy = "foreign",
    parameters = @Parameter(name = "property", value = "user"))
    private String id;

    @OneToOne(optional= false , targetEntity=User.class, cascade= CascadeType.ALL)
    @OnDelete(action = OnDeleteAction.CASCADE)
    //@JoinColumn(name="foreign_id",referencedColumnName="ID")
    @PrimaryKeyJoinColumn   
    private User user;  
    //...
}

这将正确创建两个表,并且 USERDETAIL 具有外键约束,即其主键由 USER 的 id 引用。但是,删除操作是Restrict但不是Cascade。因此,我无法删除一行 USER。

我正在使用 MySQL 服务器 5.1。似乎它不支持级联删除操作。因为我可以手动删除约束并添加一个设置为 on delete 的新约束是级联的,并且可以按预期工作。

4

2 回答 2

0

您的代码应该是:

@Entity
@Table(name="USER")
public class User implements Serializable{  
    @Id 
    @Column(name="ID")
    @GeneratedValue(generator = "system-uuid") 
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    private String id;  
    //...

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="userdetail_id")
    public UserDetail getUserDetail() {
      ...
    }
}

@Entity
@Table(name="USERDETAIL")
public class UserDetail implements Serializable{    

    @Id 
    @Column(name="ID")
    @GeneratedValue(generator = "gen") 
    @GenericGenerator(name = "gen", strategy = "foreign",
    parameters = @Parameter(name = "property", value = "user"))
    private String id;

    @OneToOne(optional= false , targetEntity=User.class, mappedBy = "userDetail")
    @PrimaryKeyJoinColumn   
    private User user;  
    //...
}

基本上,我建议让它双向,用户类是所有者(通过在 UserDetail 类中使用 mappedBy)。这样,当您删除用户时,将删除用户详细信息。

于 2012-09-17T08:19:15.000 回答
0

最后,我解决了这个问题。

首先,我已经按照http://www.mkyong.com/hibernate/hibernate-one-to-one-relationship-example-annotation/创建 oneToOne 映射实体。

但是,当我启动 Tomcat 时,它总是抛出NullPointerException映射。因此,我提出了我的问题实体,除了删除之外似乎工作正常。

我终于意识到这只是hibernate-anoatation引起的一个错误。然后我使用 3.4.0.ga 版本并再次点击链接。通过替换@GeneratedValue(strategy = IDENTITY)(我不知道为什么使用这个,hibernate 无法创建表)到

@GeneratedValue(generator = "system-uuid") 
@GenericGenerator(name = "system-uuid", strategy = "uuid") 

它按我的预期工作。

虽然表上没有外键约束,但删除所有者(USER)表确实也可以通过休眠句柄正确删除子(USERDETAIL)表。

我也不需要担心更新没有子字段的所有者表。mappedBy侧面实际上没有定义为 Khue Vu 所说的物理映射。Hibernate 足够聪明,不会删除关系。

于 2012-09-21T09:21:24.143 回答