考虑以下"模型":
USER
Long: PK
String: firstName
String: lastName
USER_EXT
Long: PK
String: moreInfo
Date: lastModified
Run Code Online (Sandbox Code Playgroud)
我正在尝试查找/创建正确的Hibernate映射(使用Annotations),这样,使用HQL查询就像"来自用户"一样简单,它将生成以下SQL:
select firstName, moreInfo from USER, USER_EXT where user.pk = user_ext.pk
Run Code Online (Sandbox Code Playgroud)
我已经尝试了所有的东西,从使用@Secondarytable到@OneToOne协会,但我不能让它工作.
我现在得到的最好结果是@OneToOne关联生成多个SQL查询,一个用于获取USER中的行,而结果集中的每一行都有一个来自USER_EXT的select查询.
这是非常无效的.
任何的想法 ?
我有以下两个类:
public class Project
{
public virtual int ProjectId { get; set; }
public virtual string ProjectName { get; set; }
public virtual LegalEntity LegalEntity { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和
public class LegalEntity
{
public virtual int LegalEntId { get; set; }
public virtual string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
映射为:
<class name="Project" table="Project" dynamic-update="true">
<id name="ProjectId">
<generator class="native"/>
</id>
<property name="ProjectName" />
<many-to-one name="LegalEntity" column="LegalEntId" fetch="join" cascade="all-delete-orphan" />
</class>
Run Code Online (Sandbox Code Playgroud)
和
<class name="LegalEntity" table="LegalEnt" dynamic-update="true">
<id name="LegalEntId">
<generator …Run Code Online (Sandbox Code Playgroud) 我将类映射到Drupal生成的现有MySQL表.我需要与表格(一对一)联系,但我遇到了问题.两个表的列nid.这两个字段都是主键.没有主键我无法定义外键.关系图不适用于主键.我的版本如下.
class Node(Base):
__tablename__ = 'node'
nid = Column(Integer, primary_key=True)
vid = Column(Integer)
uuid = Column(String(128))
type = Column(String)
field_data = relationship("NodeFieldData", order_by="NodeFieldData.nid", backref="node")
def __repr__(self):
return "<User(nid='%s', vid='%s', uuid='%s', type='%s')>" % (self.nid, self.vid, self.uuid, self.type)
class NodeFieldData(Base):
__tablename__ = 'node_field_data'
nid = Column(Integer, primary_key=True)
type = Column(String, nullable=False)
title = Column(String, nullable=False)
#nid = Column(Integer, ForeignKey('Node.nid'))
def __repr__(self):
return "<User(nid='%s', vid='%s', uuid='%s', type='%s')>" % (self.nid, self.vid, self.uuid, self.type)
Run Code Online (Sandbox Code Playgroud)
谢谢.
我在服务和 Lexikon 之间有一对一的关系,而服务有 Lexikon 的外键。我的服务不需要 Lexikon,因此我将 LexikonID 设置为可为空。但我的 Lexikon 仅当与服务相关时才能存在,因此我将导航属性设置为 [必需]。我使用的是 Code First,因此 EF 构建了我的数据库。
public class Service
{
public int ServiceID { get; set; }
//Foreignkey
public int? LexikonID { get; set; }
//Navigation Properties
public Lexikon Lexikon { get; set; }
}
public class Lexikon
{
public int LexikonID { get; set; }
//Navigation Properties
[Required]
public SoftwareService SoftwareService { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果我删除我的服务,我会尝试自动删除 Lexikon 表中的数据,但不幸的是,我不知道如何执行此操作,因为我是 EF 新手。
我在 dbContext 中尝试了以下代码:
modelBuilder.Entity<SoftwareService>()
.HasOne(l => l.Lexikon)
.WithOne(s => …Run Code Online (Sandbox Code Playgroud) c# entity-framework cascade one-to-one entity-framework-core
我知道这个问题被问了好几次,但是我找不到一个明确的例子并且回答了这个话题(我也尝试了其他可能的解决方案).
我正在使用Spring JPA并Hibernate尝试对OneToONe关系进行延迟获取.我有2个简单的Entity类,一个Repository类和使用h2数据库来延迟加载一个实体.我尝试构建时间字节码检测来实现这一点,这些是我的类.
A级
@Entity
public class A {
private String name;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(optional = false, fetch = FetchType.LAZY, mappedBy = "a")
@LazyToOne(LazyToOneOption.NO_PROXY)
private B b;
}
Run Code Online (Sandbox Code Playgroud)
B级
@Entity
public class B {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "A_ID")
private A a;
}
Run Code Online (Sandbox Code Playgroud)
知识库
public interface ARepository extends JpaRepository<A, Long> {
A findByName(String name);
}
Run Code Online (Sandbox Code Playgroud)
pom.xml字节码增强器
<plugin>
<groupId>org.hibernate.orm.tooling</groupId>
<artifactId>hibernate-enhance-maven-plugin</artifactId> …Run Code Online (Sandbox Code Playgroud) 我正在使用 JPA 为具有复合键的数据库定义数据模型。我无法更改数据库。
我有一个Car带有复合键(carType 和 carId)的实体。第二个(可选)PorscheInfo实体包含保时捷汽车的附加信息。不幸的是,相应的“porsche_info”表不包含包含 carType 信息的列,因为其条目专门引用CarType = 'Porsche'。
此操作的 SQL 很简单:
SELECT *
FROM cars
LEFT JOIN porsche_info
ON cars.CarId = porsche_info.CarId
AND cars.CarType = 'Porsche'
Run Code Online (Sandbox Code Playgroud)
如何将其转换为正确的 JPA 设置?
到目前为止,我有以下实体类:
@Embeddable
public class CarKey {
private String carType;
private String carId;
}
@Entity(name = "cars")
public class Car {
@EmbeddedId
private CarKey key;
// car information
@OneToOne
@JoinColumn(name = "CarId", referencedColumnName = "CarId")
private PorscheInfo porscheInfo;
// or
@OneToMany
@JoinColumn(name = "CarId", …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 R 中创建一个程序,用三位数机场代码替换城市名称或机场名称。我想要进行模糊匹配以提供更大的灵活性,因为我试图替换的城市/机场名称的数据来自许多不同的来源。我的问题是,通过模糊匹配左连接,我似乎无法找到一种方法来仅从右表(代码)返回与左表(名称)最接近的匹配。
例如:将城市奥古斯塔 (Augusta, GA) 与奥古斯塔 (Augusta, GA) 和奥古斯塔 (Augusta, ME) 进行匹配并复制数据。我不想限制最大距离,因为我仍然想允许灵活性,但我不能让我的数据重复。我想找到一种方法来进行部分字符串匹配,但只返回最接近的结果。
我尝试过使用 fuzzyjoin 包,但从我所见,没有办法限制只有一场比赛或只有最佳比赛。我知道在 pmatch 中有一个禁止重复的调用,但我找不到使 pmatch 作为连接工作的方法。
data <- stringdist_left_join(data, orig, ignore_case = TRUE)
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的代码,stringdist 是 R 中 fuzzyjoin 包的函数。数据集“data”包含城市名称、航班数量和其他乘客信息。“orig”数据集有一列城市/机场名称和机场代码
SAMPLE INPUT
**data table:**
City Name Passenger Name Fare Paid
Augusta, GA Jon $100
Dallas, TX Jane $200
Spokane, WA Chris $300
**orig table:**
City Name Code
Augusta, GA JCL
Dallas, TX DAL
Denver, CO DEN
Seattle, WA SEA
Spokane, WA GEG
Austin, TX AUS
Augusta, ME …Run Code Online (Sandbox Code Playgroud) 我在Company类和CompanySettings类之间有一对一的关系.当我创建一个新的Company对象时,(在Company的构造函数中为其Settings属性创建了一个CompanySettings对象),然后
SaveOrUpdate(session, companyObject)
Run Code Online (Sandbox Code Playgroud)
我希望INSERT从公司级联到CompanySettings.但是,除非我在CompanySettings对象上明确调用SaveOrUpdate,否则不会发生这种情况.
映射文件如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"`>
<class name="AST.Domain.Company, AST.Domain" table="Companies">
<id name="EntityID" column="CompanyId">
<generator class="guid.comb" />
</id>
<property name="CompanyName" />
. . .
<one-to-one name="Settings" class="AST.Domain.CompanySettings, AST.Domain"
constrained="true" lazy="false" />
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
我的公司设置类的映射文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="AST.Domain.CompanySettings, AST.Domain" table="CompanySettings">
<id name="EntityID" column="CompanyId">
<generator class="foreign">
<param name="property">Company</param>
</generator>
</id>
<property name="MaxUsers" />
<one-to-one name="Company" class="AST.Domain.Company, AST.Domain" />
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud) 很简单,我首先使用Entity Framework 4.1代码,我想用modelBuilder上的流畅调用替换我的[ForeignKey(..)]属性.类似于下面的WithRequired(..)和HasForeignKey(..)的东西,它将显式外键属性(CreatedBySessionId)与关联的导航属性(CreatedBySession)绑定在一起.但我想这样做是为了一对一的关系,而不是一对一:
modelBuilder.Entity<..>().HasMany(..).WithRequired(x => x.CreatedBySession).HasForeignKey(x => x.CreatedBySessionId)
Run Code Online (Sandbox Code Playgroud)
下面是一个更具体的例子.这与[ForeignKey(..)]属性非常愉快,但我想废除它并纯粹在modelbuilder上配置它.
public class VendorApplication
{
public int VendorApplicationId { get; set; }
public int CreatedBySessionId { get; set; }
public virtual Session CreatedBySession { get; set; }
}
public class Session
{
public int SessionId { get; set; }
[ForeignKey("CurrentApplication")]
public int? CurrentApplicationId { get; set; }
public virtual VendorApplication CurrentApplication { get; set; }
public virtual ICollection<VendorApplication> Applications { get; set; }
}
public class MyDataContext: DbContext
{
public IDbSet<VendorApplication> Applications …Run Code Online (Sandbox Code Playgroud) entity-framework one-to-one code-first ef-code-first entity-framework-4.1
one-to-one ×10
hibernate ×4
cascade ×2
jpa ×2
mapping ×2
nhibernate ×2
one-to-many ×2
c# ×1
code-first ×1
fuzzy ×1
fuzzyjoin ×1
hql ×1
insert ×1
java ×1
lazy-loading ×1
many-to-many ×1
python ×1
r ×1
sqlalchemy ×1