有人可以给我一个Hibernate中单向@OneToOne主键映射的例子吗?我尝试了很多种组合,到目前为止,我得到的最好的东西是:
@Entity
@Table(name = "paper_cheque_stop_metadata")
@org.hibernate.annotations.Entity(mutable = false)
public class PaperChequeStopMetadata implements Serializable, SecurityEventAware {
private static final long serialVersionUID = 1L;
@Id
@JoinColumn(name = "paper_cheque_id")
@OneToOne(cascade = {}, fetch = FetchType.EAGER, optional = false, targetEntity = PaperCheque.class)
private PaperCheque paperCheque;
}
Run Code Online (Sandbox Code Playgroud)
每当Hibernate尝试自动生成上述映射的模式时,它会尝试将主键创建为blob,而不是long,即PaperCheque的id类型.有人能帮帮我吗 ?如果我无法得到一个确切的解决方案,那么接近就会有所作为,但我会感激任何回应.
一对一的关系通常可以存储在同一个表中.有没有理由不把它们存放在同一张桌子上?
我正在使用JPA2和Hibernate实现.
我有这样的简单映射:
@Entity
class Topic {
@Id
@GeneratedValue(strategy = IDENTITY)
int id;
@OneToOne(cascade = ALL)
@JoinColumn(name = "id_poll")
private Poll poll;
}
@Entity
class Poll {
@Id
@GeneratedValue(strategy = IDENTITY)
int id;
}
Run Code Online (Sandbox Code Playgroud)
现在,当我删除一个也在Topic中的Poll对象时,我收到一个错误.
java.sql.SQLException:完整性约束违规FKCC42D924982D3F4B表:语句中的TOPICS [从民意调查中删除id =?]
我理解这是因为如果Poll记录在另一个表中有引用,我就无法删除它.我怎么解决这个问题?我是否必须在主题表中手动设置poll = null或者是否有更好的解决方案?
使用PHP发送大量邮件时,最好是向每个订阅者发送一封电子邮件(在所有电子邮件地址中运行for循环),还是最好只在逗号分隔列表中添加所有BCC,从而仅发送一封电子邮件?
谢谢.
我有 2 个类:条目和内容。
public class Entry implements Serializable {
@OneToOne(cascade=CascadeType.ALL)
private Content content;
}
Run Code Online (Sandbox Code Playgroud)
并且内容有他的值(名称等等)......我想要做的是,如果删除了一个内容,我想删除与......相关的任何条目
这不是典型的孤儿问题(我不是删除条目!我正在删除内容)
条目可以有或没有与...相关的内容,并且内容existenc与条目无关...
我怎么能说休眠“嘿......如果你要删除一个内容,找到任何相关的 FK 并将其删除!”
这与这个问题有关,但下面的例子较短,所以我认为另一个问题是有道理的.
我有两个实体,A和B,一对一的关系.对于A,B是可选的,并且每个B必须具有A.我想级联从A到B的删除.这是我的第一次尝试:
@Entity
public class A extends Model {
@Id
private Long id;
@OneToOne(optional = true, mappedBy = "a", cascade = CascadeType.REMOVE, orphanRemoval = true)
private B b;
}
@Entity
public class B extends Model {
@Id
private Long id;
@OneToOne(optional = false)
private A a;
}
Run Code Online (Sandbox Code Playgroud)
但是,似乎Ebean忽略了"可选"注释,因为当我为ID为1的已保存A执行查找时,将执行以下SQL:
select t0.id c0, t1.id c1
from a t0
join b t1 on t1.a_id = t0.id
where t0.id = 1
Run Code Online (Sandbox Code Playgroud)
换句话说,它执行内部而不是左连接,这导致查找失败,当没有关联B.我尝试了各种组合@JoinColumn,等等无济于事.我发现的唯一令人满意的解决方法是将A-to-B模型化为"假的"一对多关系.有更好的解决方案吗?这是一个错误还是Ebean已知/明确的限制?
我有两个实体,Document并BodyElement试图用Hibernate 4.2来坚持它们.mtdt_t填入正确的,但外键docid的mtdt_body_t表NULL.
我看到hibernate试图插入没有docid值.insert into mtdt_body_t values ( )
@Entity
@Table(name = "mtdt_t")
public class Document implements Serializable {
@Id
@Column(name = "docid", unique = true, nullable = false)
private String docid;
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
@OrderColumn
@JoinColumn(name = "docid", nullable = false)
private BodyElement bodyElement;
public String getDocid() {
return docid;
}
public void setDocid(String docid) {
this.docid = docid; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 EF Code First 来做到这一点:

有区域两个表:用户和区域。一个用户属于一个所需的区域,一个区域可以有零个或一个用户(作为管理员)。然后:
用户 *..1 区域和用户 0..1 区域
用户类:
public class User {
public int UserId { get; set; }
public string Name { get; set; }
[ForeignKey("Area")]
public int AreaId { get; set; }
[InverseProperty("Users")]
public virtual Area Area { get; set; }
public virtual Area AreaTitular { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
区域类:
public class Area {
public int AreaId { get; set; }
public string Name { get; set; }
public List<User> Users { get; …Run Code Online (Sandbox Code Playgroud) entity-framework one-to-one one-to-many code-first relationships
我不确定这是不是一个错误,或者我做错了什么,但是我尝试了很多工作来实现这个目标而我做不到.我希望你们能帮忙.
基本上我有一对一的关系,我需要lazyLoad.关系树在我的项目中有点大,我无法在没有承诺的情况下加载它.
我面临的问题是,当我保存一个孩子时,父更新生成的sql缺少更新字段: UPDATE `a` SET WHERE `id` = 1
当我不使用lazyLoading(Promises)时,这非常有效.
我使用生成的代码工具设置了一个简单的示例.
实体A.
@Entity()
export class A {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToOne(
(type: any) => B,
async (o: B) => await o.a
)
@JoinColumn()
public b: Promise<B>;
}
Run Code Online (Sandbox Code Playgroud)
实体B.
@Entity()
export class B {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToOne(
(type: any) => A,
async (o: A) => await o.b)
a: Promise<A>;
}
Run Code Online (Sandbox Code Playgroud)
main.ts
createConnection().then(async connection => {
const aRepo = getRepository(A);
const bRepo = getRepository(B); …Run Code Online (Sandbox Code Playgroud) 在经历了一些令人沮丧的问题和测试之后,我了解到 hibernate 不能懒惰地获取 ToOne 关系。
从我读过的内容来看,hibernate 通过将自己的 Set 设置为代理来延迟获取 ToMany,并且当在该 Set 上调用方法时,它会在执行操作之前获取数据库中的数据。美好的。
对于 ToOne,我看到的原因是,由于属性可以为 null(与 ToMany 不同),hibernate 必须知道它是否需要使用 null 或代理填充它,并且 hibernate 在不查询另一个表的情况下无法知道这一点。由于它必须查询其他表,因此它同时急切地获取数据。
我觉得这很愚蠢。我可以在关系的非拥有方理解它,表中没有任何内容指示是否填充了 toOne,但在拥有方,表包含一个带有外键的列,该列要么为空,要么不为空。
为什么不能休眠查询表并根据该列的值将属性设置为 null 或代理?它不需要检查第二个表,如果你的列不为空,你就知道第二个表有一个相应的条目(如果没有,你有完整性问题,hibernate 应该抛出)。
one-to-one ×10
hibernate ×5
java ×3
jpa-2.0 ×2
lazy-loading ×2
one-to-many ×2
annotations ×1
cascade ×1
code-first ×1
ebean ×1
jpa ×1
mass-emails ×1
mysql ×1
php ×1
sql ×1
typeorm ×1
typescript ×1