我看到许多有关主题的文章和文章,但我听不懂一件事。
例如:我有带有“ 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
位于单独的数据库表中,并且该表应包含对user
表的引用,我认为您不能避免在User
中使用UserBanned
,否则Hibernate不会这样做。不知道User
指的是哪个UserBanned
。如果只想摆脱行
userBanned.setUser(user);
,可以在User
UserBanned
方法中将Users
设置为setUserBanned(userBanned );
。public void setUserBanned(UserBanned userBanned) {
this.userBanned = userBanned;
userBanned.user(this);
}
然后以Ilyas answer中建议的方式从序列化中排除该字段。