休眠一对一关系

迪基尼

我看到许多有关主题的文章和文章,但我听不懂一件事。例如:我有带有“ id”,“ name”字段的“ User”表,还有有带有“ userid”和“ reason”字段的“ UserBanned”表。UserBanned.userid-它是字段User.id上的链接(外键)。

因此,hiberante中的模型如下所示:

@Entity
@Table(name = "user")
@DynamicInsert
public class User{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "user_id_generator")
    @SequenceGenerator(name = "user_id_generator", sequenceName = "user_id_seq")
    protected Integer id;

    @Column
    protected Integer name;

    @OneToOne (mappedBy = "user", cascade = CascadeType.ALL)
    protected UserBanned userBanned;

和UserBanned模型:

@Entity
@Table(name = "userbanned")
@DynamicInsert
public class UserBanned{

    @Id
    @Column(name="userid", unique=true, nullable=false)
    @GeneratedValue(generator="gen")
    @GenericGenerator(name="gen", strategy="foreign", parameters=@Parameter(name="property", value="user"))
    protected Integer userid;

    @Column
    protected String reason;

    @OneToOne
    @PrimaryKeyJoinColumn
    protected User user;

而且有效。我可以使用以下代码创建新用户和禁止用户:

    User user = new User();
    user.setName(name);
    UserBanned userBanned = new UserBanned ();
    userBanned.setReason(reason);

    user.setUserBanned(userBanned );
    userBanned.setUser(user);

    clientService.store(user);

但是,当我尝试执行gson.toJson(client)时,出现了stackoverflow错误-因为Gson无法处理序列化数据中的循环引用。但是我不能理解为什么我必须在UserBanned中设置User?为什么我不能仅仅拥有模型用户?

我的问题:我如何在休眠状态下组织诸如User(不仅有UserBanned,还有UserVIP等实体)这样的关系(与外键一对一)?

收割

如果您不想UserBanned引用User,则可以将其UserBanned嵌入并嵌入其中User

@Embeddable
public class UserBanned{
    ....
}

@Entity
@Table(name = "user")
@DynamicInsert
public class User{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "user_id_generator")
    @SequenceGenerator(name = "user_id_generator", sequenceName = "user_id_seq")
    protected Integer id;

    @Column
    protected Integer name;

    @Embedded
    protected UserBanned userBanned;

如果您希望UserBanned将in放在单独的数据库表中,并且该表应包含对user-table的引用,则我认为您不能避免使用Userin UserBanned,否则Hibernate将不知道UserUserBanned引用的是哪个

如果您只想摆脱这一行userBanned.setUser(user);,则可以将in设置User-method。UserBannedUsers setUserBanned(userBanned );

public void setUserBanned(UserBanned userBanned) {
    this.userBanned = userBanned;
    userBanned.user(this);
}

然后例如以Ilyas answer中建议的方式从序列化中排除该字段

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章