我有一个名为BusinessUser
的类,它有一个业务ID,并且有一个名为BusinessData
的对象。在BusinessData
类中,有Campaign
对象的ArrayList
,如下所示:
@Embeddable
@Access(AccessType.FIELD)
public class BusinessData {
@Transient
private ArrayList<Campaign> campaigns;
/...
}
在Campaign
类中,有一个业务 ID,它应该是引用业务用户表中的业务 id 列的外键。
@MappedSuperclass
public class Campaign {
@ManyToOne
private long businessId;
/...
}
有没有办法将businessId
的值映射到BusinessUser
类中的businessId
,而不必Campaign
持有BusinessUser
对象?还是我应该简单地添加一个BusinessUser
对象并以这种方式映射外键?
另外,我不知道我是否错了。如果我必须持有一个BusinessUser
对象,它将包含一个BusinessData
对象,该对象将包含Campaign
对象的ArrayList
,其中将包含另一个BusinessUser
,依此类推......还是我错误地认为这是一个永无止境的循环?
是的,你认为这是一个永无止境的循环是错误的,也是正确的,
这是错误的,因为BusinessData
(尽管包含ArrayList<Campaign>
)从数据库中获取数据。
这意味着它可能包含没有BusinessData
BusinessUser
。 所以循环到此停止。
但是,如果BusinessData
中的ArrayList<Campaign>
包含确实有BusinessData
的BusinessUser
,那么您是对的。
也就是说,数据库中的循环是相同的。
理论上,你可以编写一个像这样的 SQL:
SELECT BU.businessId
FROM BusinessUser BU
INNER JOIN BusinessData BD ON BU.businessId = BD.businessId
INNER JOIN campaigns C ON BD.campaignsId = C.Id
AND C.businessId = BU.businessId
这将为您提供ArrayList<Campaing>
中包含的所有BusinessUser
的结果,这些等于所选BusinessUser
。
没有错,这可能是需要考虑的事情。
也就是说,同样,您应该像这样映射您的Campaign
:
@MappedSuperclass
public class Campaign {
@ManyToOne
private BusinessUser businessUser;
/...
}
注意private BusinessUser businessUser;
!
@Join 列(name="reference_column_name")注释可以在从其他实体引用的类的属性或字段上方使用。