我有2个实体:Department <---->> Employee.因此,该部门与员工有一对多的关系,员工与部门有一对一的关系.
什么应该是一对一关系的删除规则?如果我选择级联,我可以看到删除员工时删除了部门,当然我不希望这样.我认为删除规则的逻辑选项是"无操作",但后来我收到警告.我错过了什么,或者在这种情况下删除规则是否真的是"无行动"?
我使用spring,JPA和Hibernate.
我有以下实体:
@Entity
@Table(name = "Supplier")
public class Supplier {
@Id
@Column(name = "Supplier_ID", nullable = false)
private Integer supplierId;
...
}
Run Code Online (Sandbox Code Playgroud)
和,
@Entity
@Table(name = "Product")
public class Product {
@Id
private Integer productId;
@ManyToOne(cascade = CascadeType.ALL)
@OnDelete(action = OnDeleteAction.CASCADE)
@JoinColumn(name = "Supplier_ID")
private Supplier supplier;
...
}
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是,给定的架构
谢谢.
我正在开发一个遗留的oracle数据库系统(10g),我没有详细的架构信息.我需要找出删除表中的特定记录是否会导致其他表中的级联删除.我检查了触发器.但是,由于参考约束,我不确定级联.有没有一种简单的方法来识别这个?
我认为ON DELETE CASCADE的意思是这不会发生.:\我有以下表格:
CREATE TABLE Tweets (
tweetID INTEGER NOT NULL AUTO_INCREMENT,
userID INTEGER NOT NULL,
content VARCHAR(140) NOT NULL,
dateTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
hasPoll INTEGER NOT NULL,
visible INTEGER NOT NULL DEFAULT 1,
PRIMARY KEY (tweetID),
FOREIGN KEY (userID) REFERENCES Users(userID)
ON DELETE CASCADE
);
CREATE TABLE Polls (
pollID INTEGER NOT NULL AUTO_INCREMENT,
tweetID INTEGER NOT NULL,
pollOptionText VARCHAR(300),
PRIMARY KEY (pollID),
FOREIGN KEY (tweetID) REFERENCES Tweets(tweetID)
);
Run Code Online (Sandbox Code Playgroud)
问题是,当我尝试删除附加了Poll的推文时,我收到以下错误(通过Flask):
_mysql_exceptions.IntegrityError
IntegrityError: (1451, 'Cannot delete or update …Run Code Online (Sandbox Code Playgroud) 在Django,我有一个模型:
class HmmInsectValue(models.Model):
hmm = models.ForeignKey('HmmResult', on_delete=models.CASCADE)
...
Run Code Online (Sandbox Code Playgroud)
在PostgreSQL数据库(9.3.2)上,这会产生一个约束:
FOREIGN KEY (hmm_id) REFERENCES devdash_hmmresult(id) DEFERRABLE INITIALLY DEFERRED
Run Code Online (Sandbox Code Playgroud)
而我真正想要的是:
FOREIGN KEY (hmm_id) REFERENCES devdash_hmmresult(id) ON DELETE CASCADE
Run Code Online (Sandbox Code Playgroud)
这会破坏我的代码,因为当我尝试删除一个HmmResult条目时,它会抱怨它仍然被引用HmmInsectValue.如果我用上面的线手动替换它一切正常.
知道为什么会这样吗?
这是我的 JPA 结构:
电影(看看级联类型):
@Entity
@Table(name = "movie")
public class Movie {
@Id
@Column(name = "movie_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
//@OneToMany(cascade = CascadeType.ALL, mappedBy = "primaryKey.movie") //stack overflow
@OneToMany(mappedBy = "primaryKey.movie") //works fine
private List<Rating> ratings;
....
}
Run Code Online (Sandbox Code Playgroud)
评分:
@Entity
@Table(name = "rating")
@AssociationOverrides({@AssociationOverride(name = "primaryKey.movie", joinColumns = @JoinColumn(name = "movie_id")),
@AssociationOverride(name = "primaryKey.user", joinColumns = @JoinColumn(name = "imdb_user_id"))})
public class Rating {
@EmbeddedId
private RatingId primaryKey = new RatingId();
@Column(name = "rating_value")
private Integer ratingValue;
.....
} …Run Code Online (Sandbox Code Playgroud) 我正在测试 Go 的 GORM 库。我发现这个库特别有用,并且我一步一步地处理越来越复杂的概念。
我面临着级联运营管理的问题。
在某些问题上,创建者建议使用 AfterDelete。问题是:在 After/BeforeDelete 函数中,不存在嵌套项。
每个人都有实现这个的好方法吗?
这是我的代码(如果有人发现 Gorm 几乎可以工作):
package main
import (
"time"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
"fmt"
"github.com/satori/go.uuid"
)
type Company struct {
ID string `gorm:"primary_key;column:ID"`
Name string `sql:"size:255;unique;index" gorm:"column:Name"`
Employees []Employee // one-to-many relationship
Address Address // one-to-one relationship
}
func (u Company) TableName() string {
return "Company"
}
func (u Company) String() string {
return fmt.Sprintf("ID: %s | Name: %s | Employees: %v | Address: %v ", u.ID, u.Name, u.Employees, u.Address)
} …Run Code Online (Sandbox Code Playgroud) 我有三个实体,Session、Order 和 User(我的在线电影票项目的一部分)。在我的域模型中,Order 保留了 User 和 Session 的 fk。正如你在我的代码中看到的:
@Table(name="Orders")
@Entity
public class Order {
@ManyToOne
@JoinColumn(nullable = false)
private User user;
@ManyToOne
private Session session;
...
}
@Entity
@Table(name="Session")
public class Session {
@OneToMany(fetch=FetchType.LAZY,
cascade = CascadeType.ALL,
mappedBy = "session")
private List<Order> orders = new ArrayList<Order>();
...
}
@Table(name="User")
@Entity
public class User {
@OneToMany(cascade = { CascadeType.PERSIST,
CascadeType.MERGE,
CascadeType.REMOVE },
mappedBy = "user")
private @Getter Set<Order> orders = new HashSet<>();
...
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,我可以CascadeType.ALL在 Session 和 User …
概述:
我正在构建一个spring-boot应用程序,该应用程序的一部分是从外部REST服务检索一些实体,并将其与数据库中本地保存的实体的先前版本进行比较。
我注射EntityManager用@PersistenceContext,并用它来工作与数据库,因为有许多实体类型,类型最初是未知的模块。我可以JpaRepository从工厂获得,但是不同实体类型的数量容易增加,如果可能的话,我宁愿不依赖它。
问题:
当模块检索它不在数据库中的实体时,它将执行一些业务逻辑,然后尝试保留新实体。
该Person班,这是有问题的实体之一,包含类型的三个领域Site,这往往持有相同的对象。
当我尝试使用持久保存一个在多个字段中具有Person相同Site对象的新对象时CascadeType.PERSIST,我得到了一个EntityExistsException(请参阅stacktrace(1))。
当我从Site字段中删除CascadeType.PERSIST 并尝试在多个字段中保留Person具有相同Site对象的新对象时,我得到了TransientPropertyValueException(请参见stacktrace(2))。
我想我了解两种例外情况发生的原因:
在第一种情况下,是因为在第一个站点字段被级联持久化之后,它无法在第二个字段中重新持久化。
我认为的第二种情况是因为@Transactional注释正在尝试在不持久化站点实例的情况下刷新事务。
我尝试删除@Transactional注释并自己开始并提交EntityTransaction,但我得到了一个IllegalStateException(请参阅stacktrace(3)),尽管我认为这是可以预期的,因为spring应该自己处理事务本身。
我已经看过类似问题的答案(例如this,this),但都提出了更改CascadeType的一些变体。
在另一个问题中,有人建议确保该equals()方法正确评估了有问题的实体,因此我在调试器中签入并((Person)newEntity).currentSite.equals(((Person)newEntity).homeSite)评估为true。
如何在多个字段中一致地持久保存/合并具有相同对象的实体?
编辑:我也尝试了级联类型与的各种组合fetch = FetchType.EAGER,但这不会改变它们各自的异常。
编辑2:我尝试使用a JpaRepository而不是使用EntityManager,并且根据我使用的层叠类型有效地获得了相同的异常集。
如果我使用PERSIST,但没有MERGE,我得到一个EntityNotFoundException(见堆栈跟踪(4)),如果我同时使用PERSIST和MERGE我得到一个InvalidDataAccessApiUsageException`(见堆栈跟踪(5))。
人: …
TypeORM中的级联选项是否重叠或它们的用途完全不同?在文档中对它们的描述非常稀缺,部分缺失,或者我找不到。
IOW,请执行以下选择
{ cascade: "update" } = { onUpdate: 'CASCADE' }
{ cascade: "remove" } = { onDelete: 'CASCADE' }
有同样的效果吗?
或cascade选择只为TypeORM使用,而onUpdate并onDelete只为DB模式(由移民创建的)?