我的数据库中有以下表格:
Announcements:
- AnnouncementID (PK)
- Title
AnouncementsRead (composite PK on AnnouncementID and UserID):
- AnnouncementID (PK)
- UserID (PK)
- DateRead
Users:
- UserID (PK)
- UserName
Run Code Online (Sandbox Code Playgroud)
通常我会使用多对多关系映射"AnnouncementsRead",但此表还有一个额外的"DateRead"字段.
到目前为止,我已经定义了以下实体:
public class Announcement
{
public virtual int AnnouncementID { get; set; }
public virtual string Title { get; set; }
public virtual IList<AnnouncementRead> AnnouncementsRead { get; private set; }
public Announcement()
{
AnnouncementsRead = new List<AnnouncementRead>();
}
}
public class AnnouncementRead
{
public virtual Announcement Announcement { get; set; } …Run Code Online (Sandbox Code Playgroud) nhibernate composite-key nhibernate-mapping fluent-nhibernate composite-id
我有一个关于如何使用复合键设计资源URI的问题.
我有一个名为货运的资源,有4个密钥/ ID:合作伙伴ID,初始邮政编码,最终邮政编码和重量.
实际上我的资源被设计为具有由数据库生成的增量ID,但是这种方法对于API消费者来说并不是那么好,例如,如果消费者/合作伙伴需要更新他们必须做的货运信息:
GET运费?initialZipcode = {VALUE}&finalZipcode = {VALUE}&weight = {VALUE}
上述操作的响应将是货运ID,因此最终他们可以更新信息:
PUT运费/ {ID}
合作伙伴ID由身份验证机制隐含.
对我来说,似乎很奇怪强迫合作伙伴在更新信息之前获得运费ID.
所以我的问题是:我该如何设计这个URI?
PUT运费/ initialZipcode/{VALUE}/finalZipCode/{VALUE}/weight/{VALUE}
我有没有考虑上面的设计?
另一个问题:将partnerId嵌入到身份验证机制中是一种很好的做法吗?我知道专业人士(容易消费者)和缺点(缓存,不可能共享URI等),但我不知道一般是一个好的或坏的做法.
谢谢!
是否可以在普通的JPA或JPA + Hibernate扩展中声明一个复合键,其中复合键的一个元素是一个序列?
这是我的复合类:
@Embeddable
public class IntegrationEJBPk implements Serializable {
//...
@ManyToOne(cascade = {}, fetch = FetchType.EAGER)
@JoinColumn(name = "APPLICATION")
public ApplicationEJB getApplication() {
return application;
}
@Column(name = "ENTITY", unique = false, nullable = false, insertable = true, updatable = true)
public String getEntity() {
return entity;
}
@GeneratedValue(strategy = GenerationType.AUTO, generator = "INTEGRATION_ID_GEN")
@SequenceGenerator(name = "INTEGRATION_ID_GEN", sequenceName = "OMP_INTEGRATION_CANONICAL_SEQ")
@Column(name = "CANONICAL_ID", unique = false, nullable = false, insertable = true, updatable = true)
public String getCanonicalId() …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个关系,其中可以包含四个不同部分中的任何一个,但是任何相同部分的集合都应该作为唯一处理.
示例:作业必须具有指定的公司,可以选择具有指定的位置,工作组和程序.作业可能没有没有位置的工作组.
我们假设我们有公司A,B,C; 位置X,Y,Z; 工作组I,J,K和计划1,2,3.
所以有效的关系可能包括A - X - I - 1 A - Z - 2 B - Y C C - 3 B - Z - K.
但无效关系将包括A - K(没有位置的工作组)Y - K - 1(没有公司)
所以,为了创建我的表,我已经创建了
companyID INT NOT NULL,
FOREIGN KEY companyKEY (companyID) REFERENCES company (companyID),
locationID INT,
FOREIGN KEY locationKEY (locationID) REFERENCES location (locationID),
workgroupID INT,
FOREIGN KEY workgroupKEY (workgroupID) REFERENCES workgroup (workgroupID),
programID INT,
FOREIGN KEY programKEY (programID) REFERENCES program (programID),
UNIQUE KEY companyLocationWorkgroupProgramKEY (companyID, locationID, …Run Code Online (Sandbox Code Playgroud) 我有一个名为"EventCheckin"的模型,它具有到"事件"和"用户"的ManyToOne映射."EventCheckin"表的PrimaryKey是用户的id和事件的id.我试图在我的EventCheckin模型中使用"EmbeddedId"来表示这一点,但是当我尝试保存EventCheckin时,它会尝试将user_id和event_id值放入表中两次,这显然会失败:
Caused by: org.h2.jdbc.JdbcSQLException: Duplicate column name "USER_ID"; SQL statement:
insert into eventCheckin (event_id, user_id, latitude, longitude, user_id, event
_id) values (?,?,?,?,?,?) [42121-158]
Run Code Online (Sandbox Code Playgroud)
EventCheckin课程:
@Entity
@Table(name="eventCheckin")
public class EventCheckin extends Model
{
@EmbeddedId public CheckinId id;
@MapsId("userId")
@JoinColumn(name="user_id")
@ManyToOne public User user;
@MapsId("eventId")
@JoinColumn(name="event_id")
@ManyToOne public Event event;
.....
}
Run Code Online (Sandbox Code Playgroud)
CheckinId EmbeddedId类::
@Embeddable
public class CheckinId implements Serializable
{
public Long eventId;
public String userId;
.....
}
Run Code Online (Sandbox Code Playgroud)
我的EventCheckin数据库表定义如下:
create table eventCheckin (
user_id varchar(255) not null,
event_id bigint not null, …Run Code Online (Sandbox Code Playgroud) 我有两个类Foo和Bar.数据库中的表格如下所示:
|Foo|
|id : INT (PK) | bar_id : INT (PK, FK) |
|Bar|
|id : INT (PK) |
Run Code Online (Sandbox Code Playgroud)
通常我会像这样映射它:
@Entity
public class Bar
{
@Id
@Column(name = "id")
private int id;
@OneToMany
private Set<Foo> foo;
}
@Entity
public class Foo
{
@EmbeddedId
private FooPK key;
@MapsId("barId")
@ManyToOne
@JoinColumn(name = "bar_id", referencedColumnName = "id")
private Bar bar;
}
@Embeddable
public class FooPK
{
@Column(name = "id")
private int id;
@Column(name = "bar_id")
private int barId;
} …Run Code Online (Sandbox Code Playgroud) 我正在开发一个喜欢自动编号标识符的Access数据库.每个表都使用它们,除了一个,它使用由一个人的名字,姓氏和出生日期组成的密钥.无论如何,人们开始遇到很多重复问题,因为表示关系的表可以保持两次或更多次相同的关系.我决定通过为关系表实现复合键来解决这个问题,因此我没有遇到重复问题.
所以我想知道Access世界中复合键的错误代表是什么?我想编写查询会稍微困难一些,但至少每次输入数据或在前端编辑数据时都不需要进行大量的检查.他们是非常低效还是什么?
sql ms-access primary-key composite-key composite-primary-key
我有两个类documentlog和documentversion(主键:int doc_id和int docVersionID),具有多对一关系.我使用了一个名为CompundKey的复合键类来管理复合主键.我需要自动增加docversionID,但我无法做到这一点.在这方面你能帮我吗?
@Entity
@Table(name = "Documentversion", schema = "DocumentManagement")
public class DocumentVersion implements Serializable {
private CompoundKey id;
private List<DocumentLog> documentLog;
@OneToMany(mappedBy="documentVersion", targetEntity=DocumentLog.class,
cascade ={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
public List<DocumentLog> getDocumentLog() {
return documentLog;
}
public void setDocumentLog(List<DocumentLog> documentLog) {
this.documentLog = documentLog;
}
@EmbeddedId
@AttributeOverride(name="doc_Id", column=@Column(name="doc_Id") )
public CompoundKey getId() {
return id;
}
public void setId(CompoundKey id) {
this.id = id;
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个具有复合键的实体,所以我使用@Embeddable和@EmbeddedId注释.Embeddable类看起来像这样:
@Embeddable
public class DitaAdminAccountSkillPK implements Serializable {
@ManyToOne
@JoinColumn(name = "admin_id")
private DitaAdmin admin;
@ManyToOne
@JoinColumn(name = "account_id")
private DitaAccount account;
//constructor, getters, setters...
}
Run Code Online (Sandbox Code Playgroud)
以及使用它的实体:
@Entity
public class DitaAdminAccountSkill {
@EmbeddedId
private DitaAdminAccountSkillPK id;
//constructor, getters, setters...
}
Run Code Online (Sandbox Code Playgroud)
现在我想在另一个实体中映射实体,如下所示:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "id.admin")
private List<DitaAdminAccountSkill> accountSkills;
Run Code Online (Sandbox Code Playgroud)
注意mappedBy ="id.admin",它使用DitaAdminAccountSkill的id字段引用DitaAdminAccountSkillPK中的admin字段.
这编译并运行得很好.但是,在eclipse中显示的错误显示: 在属性'accountSkills'中,"映射的"值'id.admin'无法解析为目标实体上的属性.
请注意,这是一个JPA问题,这意味着JPA方面正在抱怨.现在,我知道我可以使用@IdClass,但我只是想知道为什么它认为它是一个错误.或者我可能做了一些非常错误的事情?
我使用eclipselink了JPA.我有一个实体,它有一个由两个字段组成的复合键.以下是我的可嵌入主键类'字段(成员).
@Embeddable
public class LeavePK {
@ManyToOne(optional = false)
@JoinColumn(name = "staffId", nullable = false)
private Staff staff;
@Temporal(TemporalType.TIMESTAMP)
private Calendar date;
//setters and getters
}
Run Code Online (Sandbox Code Playgroud)
我的实体将保留与员工相关的休假数据,因此我尝试将员工对象和离开日期结合起来以生成组合键.除了我的逻辑,它不允许我在embeddable类中有一个外键映射.当我尝试使用JPA工具 - >从实体生成表时,它会给出如下错误,这解释了,但我没有得到它.
org.eclipse.persistence.exceptions.ValidationException
Exception Description: The mapping [staff] from the embedded ID class [class rs.stapp.entity.LeavePK] is an invalid mapping for this class. An embeddable class that is used with an embedded ID specification (attribute [leavePK] from the source [class rs.stapp.entity.Leave]) can only contain …Run Code Online (Sandbox Code Playgroud) composite-key ×10
java ×5
jpa ×5
hibernate ×3
annotations ×1
composite-id ×1
ebean ×1
eclipse ×1
embeddable ×1
ms-access ×1
mysql ×1
nhibernate ×1
nullable ×1
orm ×1
primary-key ×1
rest ×1
sql ×1
unique-key ×1
uri ×1