我有以下场景(在Java/Hibernate中):
当我执行这个场景时,我希望看到一个查询:INSERT x.然而,实际发生的是Hibernate执行两个查询:
此外,我还注意到在x的持续存在之后,对y的引用实际上并没有被管理,并且会话中没有Y的实例!那么,为什么要执行SELECT上的SELECT呢?有办法防止这种行为吗?
我有一个m:n关系书 - 借用 - 用户,借用是连接表.
表格给出(不能更改):
book(book_id) - 借(book_id,used_id) - 用户(user_id)
used jpa annotations:
User:
@OneToMany(targetEntity=BorrowEntity.class, mappedBy="user")
@JoinColumn(name="USER_ID", referencedColumnName="USER_ID")
private List<BorrowEntity>borrowings;
Book:
@OneToMany(targetEntity=BorrowEntity.class, mappedBy="book")
@JoinColumn(name="BOOK_ID", referencedColumnName="BOOK_ID")
private List<BorrowEntity>borrowings;
Run Code Online (Sandbox Code Playgroud)
我的问题是,通过上面的设置,它会向借位表添加一些额外的(不需要的)字段:
'user_USER_ID'和'book_BOOK_ID'
我怎样才能配置jpa注释以保持Borrow:user_id,book_id哪个足够多?
看看更多的图片:
我有一个关于Hibernate的问题.
我有两个具有多对一关系的对象:
例如:对象1:
public class Person {
@Basic
@Column(length = 50)
protected String name;
@NotFound(action=NotFoundAction.IGNORE)
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "groupCode", referencedColumnName = "code", updatable=false)
protected Group group;
...all the getters and setters...
}
Run Code Online (Sandbox Code Playgroud)
对象2:
public class Group {
@Id
@Basic
@Column(length = 3, nullable = false)
protected String code;
@Basic
@Column(length = 30, nullable = false)
protected String groupName;
@Basic
@Column(precision = 15, scale = 0)
protected long exampleFieldId;
...rest of code....
}
Run Code Online (Sandbox Code Playgroud)
我试图让这个例子尽可能简单.我的问题是Person上的关联对象(Group)可以为null.目前,当我加载一个特定的Person并抛出异常时,Hibernate会加载一个Group实例,因为它无法将exampleFieldId设置为null(因为它是一个基本类型).
我可以通过将long更改为Long来停止此错误但是,我会认为Person上的Group对象应该为null,因此首先没有加载Group对象?
有没有人知道Hibernate是否加载了相关对象而不管它是否为空,或者我是否错过了一些重要的注释?
谢谢
我将简化我的代码,我接下来会:
医生实体:
use ...\...\Entity\Paciente;
class Doctor extends Usuario {
public function __construct() {
...
$this->pacientes = new ArrayCollection();
...
}
/**
* Número de colegiado - numColegiado
*
* @var string
*
* @ORM\Column(name="numColegiado", type="string", length=255, unique=true)
*/
protected $numColegiado;
/**
* @ORM\OneToMany(targetEntity="Paciente", mappedBy="doctor")
* @var \Doctrine\Common\Collections\ArrayCollection
*/
private $pacientes;
...
}
Run Code Online (Sandbox Code Playgroud)
Paciente实体:
use \...\...\Entity\Doctor;
...
class Paciente extends Usuario {
}
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Doctor", inversedBy="pacientes")
* @ORM\JoinColumn(name="doctorNum", referencedColumnName="numColegiado", nullable=TRUE) …
Run Code Online (Sandbox Code Playgroud) 我有两种模型:第一
类:
import javax.persistence.*;
import java.util.Set;
@Entity
public class One {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
@OneToMany(mappedBy = "one")
private Set<Many> manySet;
//Constructor, Getter and Setter
}
Run Code Online (Sandbox Code Playgroud)
许多类:
import javax.persistence.*;
@Entity
public class Many {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "one_id")
private One one;
//Constructor, Getter and Setter
}
Run Code Online (Sandbox Code Playgroud)
仓库:
import com.hotel.model.Many;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ManyRepository extends JpaRepository<Many, Long> {
}
Run Code Online (Sandbox Code Playgroud)
控制器类别:
@RestController
@RequestMapping(value = "many") …
Run Code Online (Sandbox Code Playgroud) 我开始向您展示我的情况。
这是我的父对象:
@Entity
@Table(name="cart")
public class Cart implements Serializable{
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Id
@Column(name="id")
private Integer id;
@OneToMany(mappedBy="cart", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<CartItem> cartItems;
...
}
Run Code Online (Sandbox Code Playgroud)
这是我的孩子对象:
@Entity
@Table(name="cart_item")
public class CartItem implements Serializable{
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Id
@Column(name="id")
private Integer id;
@ManyToOne
@JoinColumn(name="cart_id", nullable=false)
private Cart cart;
...
}
Run Code Online (Sandbox Code Playgroud)
正如您看到数据库一样,在表cart_item(子对象)中,字段cart_id具有指向表cart(父对象)的字段ID的外键。
这是我保存对象的方式:
1)有一个restController,它读取一个JSON对象:
@RestController
@RequestMapping(value = "rest/cart")
public class CartRestController {
@Autowired
private CartService cartService;
@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.CREATED) …
Run Code Online (Sandbox Code Playgroud) 我有一个表,其中有几列包含另一个表的 ID。例子:
T1 {id,p1,p2,p3}
T2 {id,name}
Run Code Online (Sandbox Code Playgroud)
所以p1
,p2
和p3
来自标识T2
。我想要做的是选择所有,T1
并拥有名称值T2
。
这就是我现在正在使用的:
select
T1.id,T1.p1,T1.p2,T1.p3,
T2a.name as p1_name,T2b.name as p2_name,T2c.name as p3_name
from
T1 left join T2 as T2a on T1.p1=T2a.id
left join T2 as T2b on T1.p2=T2b.id
left join T2 as T2c on T1.p3=T2c.id;
Run Code Online (Sandbox Code Playgroud)
应该这样做吗?有什么我应该担心的速度问题吗?
谢谢你。
我正在尝试编写Schedule类,其中包含这样的记录:... session,base,engine declaration at here ...
class Schedule(Base):
__tablename__ = 'schedule'
id = Column(Integer, primary_key=True)
# and here i need ref to Station class
station_id = Column(Integer, ForeignKey('station.id'))
station = relationship('Station') # Also tried Station
arr_time = Column(Time)
def __init__(self, station_name, arrive_time):
self.metadata.create_all()
self.arrive_time = arrive_time
# And now I'm trying to find station object by a given name
# and add ref to it in self.station.
# The selection of a station works properly here:
station = session.query(Station).filter(Station.name == …
Run Code Online (Sandbox Code Playgroud) 我想扩展 ObjectHydrator 以受益于我的 ManyToOne 关系的水合并向实体添加额外的字段。
这是我的水合器:StatisticsDataHydrator.php
namespace AppBundle\Hydrator\ProjectAssignment;
use AppBundle\Entity\ProjectAssignment;
use Doctrine\ORM\Internal\Hydration\ObjectHydrator;
class StatisticsDataHydrator extends ObjectHydrator
{
/**
* {@inheritdoc}
*/
protected function hydrateRowData(array $data, array &$result)
{
$hydrated_result = array();
parent::hydrateRowData($data, $hydrated_result);
/** @var ProjectAssignment $project_assignment */
$project_assignment = $hydrated_result[0][0];
$result[] = $project_assignment;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的配置:config.yml
doctrine:
orm:
hydrators:
project_assignment_statisticsdata_hydrator: AppBundle\Hydrator\ProjectAssignment\StatisticsDataHydrator
Run Code Online (Sandbox Code Playgroud)
在我不使用保湿器的情况下,我没有问题:
/**
* @param ProjectStage $stage
* @return array
*/
public function findByStageWithStatisticsData(ProjectStage $stage){
$qb = $this->createQueryBuilder('pa');
$qb
//->addSelect('44')
->where($qb->expr()->eq('pa.project_stage', ':stage'))
->setParameter('stage', $stage);
return $qb->getQuery()->getResult();
}
Run Code Online (Sandbox Code Playgroud)
但当我使用保湿器时:
/** …
Run Code Online (Sandbox Code Playgroud) 我们正在开展一个迁移项目,我们正在从 HBM 文件迁移到注释。
当我尝试在属性上设置值时,我们面临重复的列映射问题,该属性基本上是同一类的实例。
public class Salary{
// All the below are coming from lookup table like empLookUp, MonthLookup,
// YearLookup, CurrencyLookUp and they are joined using their primary key
private int empId;
private int month;
private int year;
private String currency;
// Issue here: previousMonthSalary actually needs to be populated when the
// Salary is loaded, but for previous month. How do I achieve this.
private Salary previousMonthSalary;
}
Run Code Online (Sandbox Code Playgroud)
如何绘制地图previousMonthSalary
?
many-to-one ×10
hibernate ×5
java ×5
jpa ×3
doctrine ×2
join ×2
sql ×2
symfony ×2
annotations ×1
doctrine-orm ×1
getter ×1
hydration ×1
null ×1
one-to-many ×1
python ×1
spring ×1
sqlalchemy ×1
sqlite ×1