标签: many-to-one

如何防止插入时不必要的选择?

我有以下场景(在Java/Hibernate中):

  • 我有两个实体类:X和Y.X与Y的@ManyToOne关联,它不是级联的.
  • 我创建一个X(非托管)实例x和一个(非托管)Y实例y,并在x中填充y的引用.填充的y的唯一字段是主键.
  • 实体y已在底层数据库中具有相应的行,但实体x是新的.
  • 我坚持实体x.

当我执行这个场景时,我希望看到一个查询:INSERT x.然而,实际发生的是Hibernate执行两个查询:

  • 选择y
  • INSERT x

此外,我还注意到在x的持续存在之后,对y的引用实际上并没有被管理,并且会话中没有Y的实例!那么,为什么要执行SELECT上的SELECT呢?有办法防止这种行为吗?

java hibernate many-to-one

5
推荐指数
1
解决办法
425
查看次数

M:N关系在JPA中(包装表格)

我有一个m:n关系书 - 借用 - 用户,借用是连接表.

表格给出(不能更改):

  • 一方面它们也被jdbc app使用.
  • 另一方面我想通过jpa使用它们

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哪个足够多?

看看更多的图片:

书借

jpa many-to-one

5
推荐指数
1
解决办法
3224
查看次数

Hibernate是否总是加载关联的对象,即使它可以为null?

我有一个关于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是否加载了相关对象而不管它是否为空,或者我是否错过了一些重要的注释?

谢谢

java annotations hibernate many-to-one

5
推荐指数
1
解决办法
1721
查看次数

Symfony ManyToOne关系getter返回空对象

我将简化我的代码,我接下来会:

医生实体:

    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)

getter null doctrine many-to-one symfony

5
推荐指数
1
解决办法
4957
查看次数

Java Spring中POST请求@ManyToOne关系的JSON内容

我有两种模型:第一
类:

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)

java spring hibernate jpa many-to-one

5
推荐指数
1
解决办法
3868
查看次数

如何一键拯救父母和孩子(JPA和Hibernate)

我开始向您展示我的情况。

这是我的父对象:

@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)

java hibernate jpa one-to-many many-to-one

5
推荐指数
2
解决办法
5203
查看次数

SQLite 在同一张表上两次加入

我有一个表,其中有几列包含另一个表的 ID。例子:

T1 {id,p1,p2,p3}
T2 {id,name}
Run Code Online (Sandbox Code Playgroud)

所以p1p2p3来自标识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)

应该这样做吗?有什么我应该担心的速度问题吗?

谢谢你。

sql sqlite join many-to-one

4
推荐指数
1
解决办法
3990
查看次数

多对一关系返回None对象:SqlAlchemy

我正在尝试编写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)

python sqlalchemy many-to-one

4
推荐指数
1
解决办法
2624
查看次数

Symfony Doctrine Hydrator - 使用定制水化器我失去了 ManyToOne 关系

我想扩展 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)

doctrine many-to-one symfony doctrine-orm hydration

4
推荐指数
2
解决办法
7977
查看次数

如何将 @ManyToOne 关联映射到 SQL 查询的结果

我们正在开展一个迁移项目,我们正在从 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

java sql hibernate join many-to-one

4
推荐指数
1
解决办法
604
查看次数