【发布时间】:2017-04-01 05:37:45
【问题描述】:
我有一个多对一的单向关系,我正在尝试保留一个子实体,即 SubscriptionEntity 也希望它也应该保留 Parent,因为我正在使用 cascade = CascadeType.PERSIST
关于关系的背景:SubscriptionEntity 让您知道哪个 用户 与哪个 企业 相关联,并且很少有实体喜欢状态和产品告诉我们 状态 订阅以及与订阅相关的产品是什么。订阅状态是一对多双向的,因为订阅可以在会员资格暂停、活动、停用等过程中转变为多种状态。类似地,与产品的订阅关系是一对多双向的,因为用户可以订阅一种产品或不止一个。
我们不能在用户和订阅之间进行双向关联,因为用户可以与许多企业有关联。
public class SubscriptionEntity implements Domain, Serializable
{
@Column(name = "subscription2user")
@ManyToOne(optional = false, fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
@JoinColumn(name = "subscription2user")
private UserEntity user;
@Column(name = "subscription2biz")
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "subscription2biz")
private BusinessEntity business;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "subscription", cascade = CascadeType.PERSIST)
private List<ProductSubscriptionEntity> subscribedProducts;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "subscription", cascade = CascadeType.PERSIST)
private List<SubscriptionStateEntity> state;
}
public class UserEntity implements Domain, Serializable
{
private static final long serialVersionUID = 755369097357065341L;
@Id
@Column(name = "user_id")
private String id;
@Column(name = "user_first_name")
private String firstName;
@Column(name = "user_last_name")
private String lastName;
@Column(name = "user_mobile")
private BigInteger mobile;
@Column(name = "user_password")
private String password;
@Column(name = "user_create_date")
private Date createDate;
@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "user2address")
@Column(name = "user2address")
private UserAddressEntity address;
}
public class SubscriptionStateEntity implements Domain, Serializable
{
@Column(name = "subscription_state2subscription")
@ManyToOne(optional = false)
@JoinColumn(name="subscription_state2subscription")
protected SubscriptionEntity subscription;
}
public class ProductSubscriptionEntity implements Domain, Serializable
{
@Column(name = "user_product_subscription2subscription")
@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "user_product_subscription2subscription")
private SubscriptionEntity subscription;
}
场景:业务已经存在,但用户是新的,用户和订阅之间的关联也是新的。当我尝试添加新订阅时出现以下错误。如果用户已经存在于数据库中,那么它可以顺利运行。
void addSubscription(final UserEntity user, final String businessID)
{
final UserEntity userTemp = this.userDao.readUserByIdOrMobile(user.getId(), user.getMobile());
if (null == userTemp)
{
user.setId(java.util.UUID.randomUUID().toString());
user.setCreateDate(DateUtil.getDateTimestamp());
}
final BusinessEntity business = getBusinessByID(businessID);
SubscriptionEntity subscription = new SubscriptionEntity();
subscription.setUser(user);
subscription.setBusiness(business);
super.getEm().persist(subscription);
}
原因: org.apache.openjpa.persistence.EntityExistsException:无法添加或 更新子行:外键约束失败 ... ... 参考
user(user_id) ON DELETE NO ACTION ON UPDATE NO ACTION
非常感谢任何帮助。提前致谢。
【问题讨论】:
-
你确定这是工作代码吗?通常,当您有 JoinColumn 时,不会使用 Column。会抛出注解异常
-
是的,它的工作代码在持续订阅时遇到异常。
-
对于 OpenJPA,它适用于 JoinColumn。当我们使用 Hibernate 时它不会工作。